package com.moduleSys.dao.base;

import com.moduleSys.entity.PageInfo;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

/**
 * @author caizw
 * @createDate 2018/2/6
 * @description 作用描述
 */
public interface BaseDao<T, PK extends Serializable> {
    /**
     * 保存数据对象
     *
     * @param entity
     * @return
     */
    void save(T entity);

    /**
     * 根据表的id删除数据
     *
     * @param entity
     */
    void delete(T entity);

    void deleteDatchByPk(Object[] entityIds);

    /**
     * 更新对象
     *
     * @param entity
     * @return
     */
    void update(T entity);

    /**
     * id 为空执行新增操作，否则更新操作
     *
     * @param entity
     */
    void saveOrUpdate(T entity);

    /**
     *  按一个字段条件查询
     * @param filed 某个字段，必须是实体类属性值，不能是表字段
     * @param object 条件
     * @return
     */
    List<T> selectByFiled(String filed, Object object);

    /**
     * 查询全部
     * @return
     */
    List<T> getList();

    /**
     * 根据id查询
     *
     * @param pk
     * @return
     */
    T findByid(PK pk);

    /**
     * @param sql      带有 N 个占位符
     * @param paramMap 占位符参数 list集合
     * @return 返回集合
     */
    List<T> findListBySqlMoreFiled(String sql, Map<String, ? extends Object> paramMap);

    /**
     * 多个字段的查询
     *
     * @param hql      表名
     * @param paramMap 将你的字段传入map中
     * @return
     */
    List<T> findListByHqlMoreFiled(String hql, Map<String, ? extends Object> paramMap);

    /**
     * 多个字段的查询
     *
     * @param clazz
     * @param paramMap 将你的字段传入 map 中,key 必须为实体类属性名，
     * @return
     */
    List<T> findByMoreFiled(Class<T> clazz, Map<String, ? extends Object> paramMap);

    /**
     *
     * @param paramMap 以map存储key,value
     * @param pageSize 一个页面的条数
     * @param pageNumber 第几页
     * @param orderBy 排序，order by字符已写好，只需传入什么字段按什么排序即可，例如：id desc 或 id asc
     * @return
     */
    PageInfo<T> findPageByMoreFiled(Map<String, ? extends Object> paramMap, int pageSize, int pageNumber, String orderBy);

    /**
     * 多字段查询分页
     *
     * @param hql        表名
     * @param map        以map存储key,value
     * @param pageSize   一个页面的条数
     * @param pageNumber 第几页
     * @return
     */
    PageInfo<T> findPageByHqlMoreFiled(String hql, Map<String, ? extends Object> map, int pageSize, int pageNumber);

    /**
     * 多字段查询分页
     *
     * @param sql        表名
     * @param map        以map存储key,value
     * @param pageSize   第几页
     * @param pageNumber 一个页面的条数
     * @return
     */
    PageInfo<T> findPageBySqlMoreFiled(String sql, Map<String, ? extends Object> map, int pageSize, int pageNumber);


    /**
     * 根据传入的map遍历key,value拼接字符串，以id为条件更新
     *
     * @param hql 表名
     * @param map 传入参数放入map中
     * @return
     */
    Integer updateFiled(String hql, Map<String, ? extends Object> map, boolean isHQL);

}